package usermgr

import (
	"fmt"
	"sync"
	"time"
)

type UserMgr struct {
	// deadlock.RWMutex
	users sync.Map
}

func NewUserMgr() *UserMgr {
	return &UserMgr{
		// users: make(map[int32]*User),
	}
}

func (m *UserMgr) FindUser(uid int32) bool {
	// m.RLock()
	// defer m.RUnlock()

	if _, ok := m.users.Load(uid); ok {
		return true
	}
	return false
}

func (m *UserMgr) AddUser(account int32, user *User) bool {
	// m.Lock()

	// u, ok := m.users[account]
	// m.users[account] = user

	// m.Unlock()

	value, ok := m.users.Load(account)
	m.users.Store(account, user)

	if ok {
		u := value.(*User)
		fmt.Println("--用户重复登录,执行相应的逻辑", u)
		// if u.INet == user.INet { //同一个网络用户就不踢起
		// 	return false
		// } else {
		// 	u.Kick(0)
		// 	u.Destroy()
		// }
	}
	return true
}

func (m *UserMgr) GetUser(account int32) *User {
	// m.RLock()
	// defer m.RUnlock()

	// u, ok := m.users[account]

	value, ok := m.users.Load(account)
	if ok {
		u := value.(*User)
		return u
	}
	return nil
}

func (m *UserMgr) ResetUser(account int32) bool {
	// m.Lock()
	// u, ok := m.users[account]
	// m.Unlock()

	value, ok := m.users.Load(account)
	if ok {
		u := value.(*User)
		u.Reset()
		// obj.SetProperty("user", u)
		//delete(m.offlinelist, account)
		return true
	}
	return false
}

func (m *UserMgr) DelUser(user *User) bool {
	// m.Lock()

	// u, ok := m.users[user.Uid]

	value, ok := m.users.Load(user.Uid)
	if ok {
		u := value.(*User)
		fmt.Println("--用户退出,执行相应的逻辑", u)
		// if u.INet == user.INet {
		// delete(m.users, user.Uid)

		// m.Unlock()
		// 	m.users.Delete(user.Uid)
		// 	user.Destroy()
		// 	return true
		// }
	}
	// m.Unlock()
	return false
}

// func (m *UserMgr) ReportDataServer(sock network.INet) int {
// 	var (
// 		// users []*User
// 		req = &pbinner.GatewayReportDataReq{}
// 	)

// 	// m.RLock()
// 	// for _, v := range m.users {
// 	// 	users = append(users, v)
// 	// }
// 	// m.RUnlock()

// 	req.Report = make([]*pbinner.GatewayReportDataReq_Report, 0)
// 	// for i, user := range users {
// 	// 	req.Report[i] = &pbinner.GatewayReportDataReq_Report{Uid: user.Uid, From: user.From, Version: user.Version}
// 	// }
// 	m.users.Range(func(key interface{}, value interface{}) bool {
// 		user := value.(*User)
// 		req.Report = append(req.Report, &pbinner.GatewayReportDataReq_Report{Uid: user.Uid, From: user.From, Version: user.Version})
// 		return true
// 	})
// 	sock.SendMessage(pbcore.PackMessage("inner.GatewayReportDataReq", req))

// 	return 0
// }

// func (m *UserMgr) SendMessageToUser(account int32, msg network.IMessage) bool {
// 	// m.RLock()
// 	// user, ok := m.users[account]
// 	// m.RUnlock()
// 	value, ok := m.users.Load(account)

// 	if !ok {
// 		return false
// 	}

// 	user := value.(*User)
// 	user.SendMessage(msg)
// 	return true
// }

// func (m *UserMgr) BroadcastMessageAllUsers(msg network.IMessage) bool {
// 	// m.RLock()
// 	// defer m.RUnlock()

// 	// for _, user := range m.users {
// 	// 	user.SendMessage(msg)
// 	// }
// 	m.users.Range(func(key interface{}, value interface{}) bool {
// 		user := value.(*User)
// 		user.SendMessage(msg)
// 		return true
// 	})
// 	return true
// }

// func (m *UserMgr) Size() int {
// 	m.RLock()
// 	defer m.RUnlock()
// 	return len(m.users)
// }

type User struct {
	// network.INet //嵌入
	// srv          *Server

	Uid       int32 // 用户ID
	From      int32
	Version   int32
	NickName  string
	Cover     string
	Age       int
	Gender    uint8
	UserInfo  string
	TimeStamp time.Time //上次握手或心跳时间

	// GameClient network.INet
}

// Reset 重连时重用结构体、重置socket结构体
// Reset里面不能调用及隐晦调用userMgr锁, 避免死锁
func (u *User) Reset() {
	// u.INet = sock
	u.TimeStamp = time.Now()
	// sock.SetProperty("user", u)
}

func (u *User) Kick(errCode int) {
	// resp := &pbgate.GatewayKick{Flag: int32(errCode)}
	// u.SendMessage(pbcore.PackMessage("gate.GatewayKick", resp))
}

// 立即销毁
func (u *User) Destroy() {
	// if u.INet != nil {
	// 	sock := u.INet
	// 	u.INet = nil
	// 	sock.RemoveProperty("user")
	// 	sock.Close()
	// }

	// if u.GameClient != nil {
	// 	client := u.GameClient
	// 	u.GameClient = nil
	// 	client.Close()
	// }
}

// 发送消息
// func (u *User) SendMessage(msg network.IMessage) {
// if u.INet != nil {
// 	u.INet.SendMessage(msg)
// }
// }
